#include "thread.h"
#include "threadpool.h"

// 线程执行任务的入口函数
void* doTask(void *task_arg)
{
    ThreadPool *pool = (ThreadPool*)task_arg;

    for (;;)
    {
        pthread_mutex_lock(&pool->queMutex_);
        // 如果任务队列位空，等待条件变量成立
        while (pool->taskQue_.size() == 0)
        {
            pthread_cond_wait(&pool->queCond_, &pool->queMutex_);
        }

        weak_ptr<Task> wp = pool->taskQue_.front();
        pool->taskQue_.pop();
        pthread_mutex_unlock(&pool->queMutex_);

        // wp提升成sp 提升成功，指定task的run方法，执行多态调用
		// 使用weak_ptr,此处就出现问题了。
        shared_ptr<Task> sp = wp.lock();
        if (sp != nullptr)
        {
            sp->run(); // 多态调用，同名覆盖方法
        }
    }
}

Thread::Thread(ThreadPool *pool)
    : pool_(pool)
{}

// 开始执行
void Thread::start()
{
    pthread_create(&tid_, NULL, doTask, pool_);
}